package _20250304;

public class MyThread {
    /**
     * 初级
     * 题目：创建两个线程，一个线程打印 1 到 10 的数字，另一个线程倒序打印 10 到 1 的数字。
     * 题目：编写程序启动三个线程，每个线程打印自己的线程名 5 次。
     * 中级
     * 题目：实现一个简单的生产者 - 消费者模型。生产者线程不断生成随机整数并放入一个固定大小为 5 的数组中，消费者线程不断从数组中取出整数并打印。要求使用synchronized关键字实现线程同步，防止数组越界和数据竞争。
     * 题目：有两个线程，线程 A 对变量count进行 100 次加 1 操作，线程 B 对变量count进行 100 次减 1 操作，实现代码保证操作完成后count的值为 0 。
     * 高级
     * 题目：使用 Java 并发包中的CyclicBarrier实现一个多线程程序。假设有 5 个运动员线程进行跑步比赛，所有运动员到达起跑线
     * 调用CyclicBarrier的await方法）后，比赛才开始（所有线程同时继续执行后续代码），当有任意一个运动员跑完比赛（通过某个条件判断），通知其他运动员停止比赛。
     * 题目：设计一个多线程程序模拟银行转账操作。有多个线程同时进行转账操作，从一个账户向另一个账户转账一定金额。要求使用锁机制确保转账过程的原子性和线程安全，同时考虑死锁的可能性并避免死锁 。
     */


    public static void main(String[] args) {
        /**
         *   题目：创建两个线程，一个线程打印 1 到 10 的数字，另一个线程倒序打印 10 到 1 的数字。
         */
        //构造
        Thread  ascendingPrinter= new Thread(new AscendingPrinter());
        Thread descendingPrinter= new Thread(new DescendingPrinter());
        //启动
        ascendingPrinter.start();
        descendingPrinter.start();

    }

    /**
     * 升序输出1-10
     */

    private static class AscendingPrinter implements Runnable {
        @Override
        public void run() {
            try {
                for (int i = 0; i < 10; i++) {
                    System.out.println("AscendingPrinter:"+(i+1));
                    Thread.sleep(500);
                }
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
        }
    }

    /**
     * 降序输出1-10
     */

    private static class DescendingPrinter implements Runnable {
        @Override
        public void run() {
            for (int i = 0; i < 10; i++) {
                System.out.println("DescendingPrinter:"+(10-i));
                try {
                    Thread.sleep(500);
                } catch (InterruptedException e) {
                    throw new RuntimeException(e);
                }
            }
        }
    }
}
